<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

use \think\Request;

/*********************************************加密解密部分*********************************************/

/**
 * 添加填充数据,PKCS7规则
 *
 * @param $source
 * @return string
 */
function add_pkcs7_padding($source)
{
    //去除额外代码
    $source = trim($source);

    //计算块大小
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

    //数据填充
    $pad = $block - (strlen($source) % $block);
    if ($pad <= $block) {
        $clientar = chr($pad);
        $source .= str_repeat($clientar, $pad);
    }
    return $source;
}

/**
 * AES加密
 *
 * @param string $key 加密key值
 * @param string $plaintext 明文
 * @return string 密文
 */
function aes_encrypt($key, $plaintext)
{
    //通过key截取vector
    $vector = substr($key, 0, 16);

    //进行数据填充
    $plaintext = add_pkcs7_padding($plaintext);

    //加密数据
    $ciphertext =  mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
        $plaintext, MCRYPT_MODE_CBC, $vector);

    //返回base64编码后的密文
    return base64_encode($ciphertext);
}


/**
 * 移去填充算法
 * @param string $source
 * @return string
 */
function remove_pkcs7_padding($source)
{
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $clientar = substr($source, -1, 1);
    $num = ord($clientar);
    if($num > $block)
    {
        return $source;
    }
    $len = strlen($source);
    for($i = $len - 1; $i >= $len - $num; $i--)
    {
        if(ord(substr($source, $i, 1)) != $num)
        {
            return $source;
        }
    }
    $source = substr($source, 0, -$num);
    return $source;
}

/**
 * 解密方法
 * @param string $str
 * @return string
 */
function aes_decrypt($key, $ciphertext)
{
    //AES, 128 ECB模式加密数据
    $ciphertext = base64_decode($ciphertext);

    //获取vector
    $vector = substr($key, 0, 16);
    $plaintext =  mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext, MCRYPT_MODE_CBC, $vector);

    return remove_pkcs7_padding($plaintext);

}

/**
 * 检测URL是否正确
 *
 * @param String $url 待检测URL
 * @return bool
 */
function check_url($url)
{
    $client = curl_init();
    curl_setopt ($client, CURLOPT_URL, $url);
    //不下载
    curl_setopt($client, CURLOPT_NOBODY, 1);
    //设置超时
    curl_setopt ($client, CURLOPT_CONNECTTIMEOUT, 3);
    curl_setopt($client, CURLOPT_TIMEOUT, 3);
    curl_exec($client);
    $http_code = curl_getinfo($client, CURLINFO_HTTP_CODE);
    if($http_code == 200)
    {
        return true;
    }
    return false;
}

/**
 * 判断是否为web图片
 *
 * @param string $image 图片地址
 * @return bool 如果是web图片，返回true；否则返回false
 */
function check_web_image($image)
{
    //检测是否为链接
    if (!check_url($image))
    {
        return false;
    }

    //获取headers信息
    $headers = get_headers($image, 1);

    //获取内容类型
    $contentType = $headers["Content-Type"];

    //根据Content-Type判断是否为图片
    if (strpos($contentType, "image/") === 0)
    {
        return true;
    }

    return false;
}


/**
 * 当前日期时间
 *
 * @return false|string
 */
function now_datetime()
{
    return time();
}

/**
 *时间戳显示为日期
 */
function show_datetime($time){
    return empty($time) ? '' : date('Y-m-d H:i:s',$time);
}
/**
 *隐藏手机号
 */
function hide_mobile($mobile){
    $mobile = substr_replace($mobile, '****', 3, 4);
    return $mobile;
}
/*************************************************发送消息****************************************/

/**
 * 发送API错误
 *
 * @param string $code 编码
 * @param string $error 错误内容
 */
function send_api_error($code, $error)
{
    $arr = array("result_code" => $code, "result_info" => $error);

    if (!input('?get.no_encrypt'))
    {
        die(aes_encrypt(config("aes_encrypt_key"), json_encode($arr, JSON_UNESCAPED_UNICODE)));
    }
    else
    {
        die(json_encode($arr, JSON_UNESCAPED_UNICODE));
    }
}

/*****************************错误编码****************************/
//登录异常错误
define("H_API_ERROR_TOKEN", "1111");
//用户输入错误
define("H_API_ERROR_USER", "2222");
//APP开发者错误
define("H_API_ERROR_DEVELOPER", "3333");
//服务器端开发者错误
define("H_API_ERROR_SERVER", "4444");


/**
 * 发送服务器级别信息
 *
 * @param string $error 错误信息
 */
function send_server_error($error = "")
{
    send_api_error(H_API_ERROR_SERVER, $error);
}

/**
 * 发送开发者级别错误信息
 *
 * @param string $error 错误信息
 */
function send_developer_error($error = "")
{
    send_api_error(H_API_ERROR_DEVELOPER, $error);
}

/**
 * 发送用户输入错误
 *
 * @param string $error
 */
function send_user_error($error = "")
{
    send_api_error(H_API_ERROR_USER, $error);
}

/**
 * 发送登录异常
 *
 * @param string $error
 */
function send_token_error($error = "")
{
    send_api_error(H_API_ERROR_TOKEN, $error);
}

/**
 * 验证银行卡号是否有效(前提为16位或19位数字组合)
 *
 * @param string $card 银行卡号
 * @return bool                         有效返回true,否则返回false
 */
function validate_bank_card($card)
{
    //第一步,反转银行卡号
    $cardNum = strrev($card);

    //第二步,计算各位数字之和
    $sum = 0;
    for ($i = 0; $i < strlen($cardNum); ++$i)
    {
        $item = substr($cardNum, $i, 1);
        //
        if ($i % 2 == 0)
        {
            $sum += $item;
        }
        else
        {
            $item *= 2;
            $item = $item > 9 ? $item - 9 : $item;
            $sum += $item;
        }
    }

    //第三步,判断数字之和余数是否为0
    if ($sum % 10 == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

/**
 * 验证身份证号是否合法
 *
 * @param string $identity 待验证的身份证号
 * @return bool
 */
function validate_identity($identity)
{
    //判断证号位数
    if (!preg_match("/(\\d{18})|(\\d{17}(\\d|X|x))/i", $identity))
    {
        return false;
    }

    //每位数对应的乘数因子
    $factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];

    //计算身份证号前17位的和
    $sum = 0;
    for ($index = 0; $index < 17; ++$index)
    {
        $sum += $factors[$index] * intval(substr($identity, $index, 1));
    }

    //将和对11取余
    $mod = $sum % 11;
    //最后一位字符
    $lastLetter = substr($identity, -1, 1);

    //根据获得的余数，获取验证码
    switch ($mod)
    {
        case 0:
            return $lastLetter == 1;
        case 1:
            return $lastLetter == 0;
        case 2:
            return strtoupper($lastLetter) == "X";
        default:
            return $lastLetter == 12 -$mod;
    }
}

/**
 * 文件上传保存名称
 *
 * @return string 文件上传后的名称
 */
function upload_save_name()
{
    return date("m/d/Y") . '/' . md5(microtime(true));
}

/**
 * 获取完整的图像地址
 *
 * @param string $image 图片地址
 * @return string
 */
function get_whole_image($image)
{
    if (empty($image) || check_web_image($image))
    {
        return $image;
    }
    else
    {
        //获取当前域名
        $domain = request()->domain();

        //处理后台图片
        if (request()->module() == "admin")
        {
            $domain = str_replace("admin", "images", $domain);
        }

        //处理接口图片
        if (request()->module() == "api")
        {
            $domain = str_replace("api", "images", $domain);
        }

        //将https更改为http
        $domain = str_replace("https", "http", $domain);

        return $domain . $image;
    }
}

/**
 * 获取指定分类的完整名称
 *
 * @param $id
 * @return mixed
 */
function get_category_whole_name($id)
{
    return db("category")
        ->where("id", $id)
        ->value("title");
}

/**
 * 生成指定长度的随机数
 * @param $length
 * @param bool $numeric
 * @return string
 */
function random($length, $numeric = false)
{
    $seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
    $seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));
    if ($numeric) {
        $hash = '';
    } else {
        $hash = chr(rand(1, 26) + rand(0, 1) * 32 + 64);
        $length--;
    }
    $max = strlen($seed) - 1;
    for ($i = 0; $i < $length; $i++) {
        $hash .= $seed{mt_rand(0, $max)};
    }
    $hash=strtoupper($hash);
    return $hash;
}



/**
 * 生成APP URL
 *
 * @param $url
 * @return mixed|string
 */
function generate_app_url($url)
{
    //拼接完整URL
    $url = request()->domain() . $url;

    //使用HTTP替换HTTPS
    $url = str_replace("https://", "http://", $url);

    //将api或admin替换为app
    $url = str_replace("api.", "app.", $url);
    $url = str_replace("admin.", "app.", $url);

    return $url;
}

/**
 * 判断请求是否为IOS系统
 *
 * @return bool
 */
function is_ios()
{
    // 获取设备代理信息
    $agent = request()->header('USER_AGENT');

    // 判断是否有IOS信息
    if (strpos($agent, 'iPhone') || strpos($agent, 'iPad'))
    {
        return true;
    }

    return false;
}

function get_article_tag($tag_id='',$type=1){
    $list = config('article_tag');
    if($type==1){
        return @$list[$tag_id];
    }else{
        return $list;
    }
}

function get_regionName($rid){
    $cname = db('region')->where('id',$rid)->value('title');
    return empty($cname) ? '' : $cname;
}

function get_comment_source($id='',$type=1){
    $arr = [
        1   =>  '默认',
        2   =>  '会员提交',
    ];
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function get_comment_type($id='',$type=1){
    $arr = config('comment_type');
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function get_money_log_type($id='',$type=1){
    $arr = config('money_log_type');
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function get_order_type($id='',$type=1){
    $arr = config('order_type');
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function get_pay_type($id='',$type=1){
    $arr = [
        1   =>  '微信',
        2   =>  '支付宝',
    ];
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function get_pay_status($id='',$type=1){
    $arr = [
        0   =>  '未支付',
        1   =>  '已支付',
    ];
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function get_count_status($id='',$type=1){
    $arr = [
        0   =>  '未结算',
        1   =>  '已结算',
    ];
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function get_withdraw_type($id='',$type=1){
    $arr = [
        1   =>  '微信',
        2   =>  '支付宝',
        3   =>  '银行卡',
    ];
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function get_withdraw_status($id='',$type=1){
    $arr = [
        0   =>  '待处理',
        1   =>  '已打款',
        2   =>  '已驳回',
    ];
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function get_bussiness_agreement_status($id='',$type=1){
    $arr = [
        0 => '待处理',
        1 => '已同意'
    ];
    if($type!=1){
        return $arr;
    }else{
        return @$arr[$id];
    }
}

function save_money_log($uid,$union_id='',$type,$money,$source){
    $data = [
        'uid'=>$uid,
        'union_id'=>$union_id,
        'type'=>$type,
        'money'=>$money,
        'source'=>$source,
        'create_time'=>now_datetime()
    ];
    db('money_log')->insert($data);
}

/**
 * 删除路径
 *
 * @param $directory
 * @return bool
 */
function removeDirectory($directory)
{
    //如果目录不存在，则返回上级操作
    if (!file_exists($directory))
    {
        return false;
    }

    //如果是文件或文件链接则删除文件
    if (is_file($directory) || is_link($directory))
    {
        return unlink($directory);
    }

    //如果是路径，则递归处理
    $dir = dir($directory);
    if($dir)
    {
        //递归处理文件
        while (false !== $entry = $dir->read())
        {
            if ($entry == '.' || $entry == '..')
            {
                continue;
            }

            //递归
            removeDirectory($directory . '/' . $entry);
        }
    }

    //关闭文件
    $dir->close();

    //删除路径
    return rmdir($directory);
}
/**
 * 清除缓存
 */
function clear_cache()
{
    //清除临时文件
    {
        $dirs = array(TEMP_PATH);
        foreach($dirs as $value)
        {
            removeDirectory($value);
        }
    }

    //清除缓存文件
    {
        $dirs = array(CACHE_PATH);
        foreach($dirs as $value)
        {
            removeDirectory($value);
        }
    }
}

/**
 *删除上一月无用Excel文件
 */
function removeOldExcel(){
    $del_path = config("upload_path") . '/' . "excel";
    $dir = @dir($del_path);
    if($dir)
    {
        //递归处理文件
        while (false !== $entry = $dir->read()) {
            if ($entry == '.' || $entry == '..' || $entry == date('m'))
            {
                continue;
            }

            //递归
            removeDirectory($del_path . '/' . $entry);
        }
    }

}

/**
 * 验证手机号是否正确
 *
 * @param string $mobile                       待验证的手机号
 * @return int                          如果正确则返回true
 */
function verify_mobile($mobile)
{
    $reg = config('tel_regular');

    return preg_match($reg, $mobile) ? true : false;
}

/**
 *  验证邮箱是否正确
 *
 * @param $email
 * @return int
 */
function verify_email($email)
{
    if (!$email) {
        return false;
    }

    return preg_match('#[a-z0-9&\-_.]+@[\w\-_]+([\w\-.]+)?\.[\w\-]+#is', $email) ? true : false;
}

function curl_post($url,$array){

    $curl = curl_init();
    //设置提交的url
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 0);
    //设置获取的信息以文件流的形式返回，而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //设置post方式提交
    curl_setopt($curl, CURLOPT_POST, 1);
    //设置post数据
    $post_data = $array;
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
    if(!is_array($array))
    {
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_HTTPHEADER,array('Content-Type: application/json; charset=utf-8','Content-Length:' . strlen($array)));
    }
    //执行命令
    $data = curl_exec($curl);
    //关闭URL请求
    curl_close($curl);
    //获得数据并返回
    return $data;
}

/**
 * 友好时间显示
 * @param $time
 * @return bool|string
 */
function friend_date($time)
{
    if (!$time)
        return false;
    $fdate = '';
    $d = time() - intval($time);
    $ld = $time - mktime(0, 0, 0, 0, 0, date('Y')); //得出年
    $md = $time - mktime(0, 0, 0, date('m'), 0, date('Y')); //得出月
    $byd = $time - mktime(0, 0, 0, date('m'), date('d') - 2, date('Y')); //前天
    $yd = $time - mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')); //昨天
    $dd = $time - mktime(0, 0, 0, date('m'), date('d'), date('Y')); //今天
    $td = $time - mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')); //明天
    $atd = $time - mktime(0, 0, 0, date('m'), date('d') + 2, date('Y')); //后天
    if ($d == 0) {
        $fdate = '刚刚';
    } else {
        switch ($d) {
            case $d < $atd:
                $fdate = date('Y年m月d日', $time);
                break;
            case $d < $td:
                $fdate = '后天' . date('H:i', $time);
                break;
            case $d < 0:
                $fdate = '明天' . date('H:i', $time);
                break;
            case $d < 60:
                $fdate = $d . '秒前';
                break;
            case $d < 3600:
                $fdate = floor($d / 60) . '分钟前';
                break;
            case $d < $dd:
                $fdate = floor($d / 3600) . '小时前';
                break;
            case $d < $yd:
                $fdate = '昨天' . date('H:i', $time);
                break;
            case $d < $byd:
                $fdate = '前天' . date('H:i', $time);
                break;
            case $d < $md:
                $fdate = date('m月d日 H:i', $time);
                break;
            case $d < $ld:
                $fdate = date('m月d日', $time);
                break;
            default:
                $fdate = date('Y年m月d日', $time);
                break;
        }
    }
    return $fdate;
}

function downloadFile($file_url,$new_name=''){
    if(!isset($file_url)||trim($file_url)==''){
        return [
            'status'=>1,
            'info'=>'文件地址不能为空'
        ];
    }
    if(!file_exists($file_url)){ //检查文件是否存在
        return [
            'status'=>1,
            'info'=>'文件不存在'
        ];
    }
    $file_name=basename($file_url);
    $file_type=explode('.',$file_url);
    $file_type=$file_type[count($file_type)-1];
    $file_name=trim($new_name=='')?$file_name:urlencode($new_name).'.'.$file_type;
    $file_content=fopen($file_url,'r'); //打开文件
    //输入文件标签
    header("Content-type: application/octet-stream");
    header("Accept-Ranges: bytes");
    header("Accept-Length: ".filesize($file_url));
    header("Content-Disposition: attachment; filename=".$file_name);
    //输出文件内容
    echo fread($file_content,filesize($file_url));
    fclose($file_content);
}
